import json
import zipfile
import tempfile
import os
from pathlib import Path

class MCUILoader:
    def __init__(self):
        self.temp_dirs = []  # 用于清理临时目录
        
    def load(self, file_path):
        """加载MCUI文件"""
        file_path = Path(file_path)
        
        if not file_path.exists():
            raise FileNotFoundError(f"文件不存在: {file_path}")
        
        # 检查是否为ZIP文件（压缩包格式）
        if self._is_zip_file(file_path):
            return self._load_bundle(file_path)
        else:
            return self._load_single_file(file_path)
    
    def _is_zip_file(self, file_path):
        """检查是否为ZIP文件"""
        try:
            with zipfile.ZipFile(file_path, 'r') as zip_ref:
                return True
        except zipfile.BadZipFile:
            return False
    
    def _load_single_file(self, file_path):
        """加载单一JSON文件"""
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                data = json.load(f)
        except json.JSONDecodeError as e:
            raise ValueError(f"JSON解析错误: {e}")
        
        # 验证基本结构
        if not isinstance(data, dict):
            raise ValueError("MCUI文件必须是JSON对象")
        
        # 设置资源根路径为文件所在目录
        data['_assets_root'] = file_path.parent
        data['_is_bundle'] = False
        return data
    
    def _load_bundle(self, file_path):
        """加载压缩包格式 - 改进版本，支持智能解压"""
        # 创建临时目录
        temp_dir = tempfile.mkdtemp(prefix="mcui_")
        self.temp_dirs.append(temp_dir)
        
        print(f"解压MCUI包到: {temp_dir}")
        
        # 解压文件
        try:
            with zipfile.ZipFile(file_path, 'r') as zip_ref:
                zip_ref.extractall(temp_dir)
        except Exception as e:
            raise ValueError(f"解压文件失败: {e}")
        
        # 智能检测资源根目录
        assets_root = self._find_assets_root(Path(temp_dir))
        print(f"检测到资源根目录: {assets_root}")
        
        # 在主资源根目录下查找配置文件
        config_path = self._find_config_file(assets_root)
        if not config_path:
            raise ValueError("在压缩包中未找到MCUI配置文件")
        
        # 加载配置
        try:
            with open(config_path, 'r', encoding='utf-8') as f:
                data = json.load(f)
        except json.JSONDecodeError as e:
            raise ValueError(f"配置文件JSON解析错误: {e}")
        
        # 设置资源根路径
        data['_assets_root'] = assets_root
        data['_is_bundle'] = True
        
        print(f"成功加载MCUI包，资源根目录: {assets_root}")
        return data
    
    def _find_assets_root(self, temp_dir):
        """
        智能检测资源根目录
        处理两种压缩方式：
        1. 直接压缩内容：temp_dir/文件...
        2. 压缩包含外层文件夹：temp_dir/外层文件夹/文件...
        """
        items = list(temp_dir.iterdir())
        
        # 如果只有一个项目且是文件夹，可能是外层文件夹
        if len(items) == 1 and items[0].is_dir():
            potential_root = items[0]
            
            # 检查这个文件夹内是否有配置文件
            if self._find_config_file(potential_root):
                print(f"检测到外层文件夹结构，使用: {potential_root}")
                return potential_root
        
        # 否则使用临时目录本身作为根目录
        print(f"使用直接压缩结构，根目录: {temp_dir}")
        return temp_dir
    
    def _find_config_file(self, search_dir):
        """在指定目录中查找配置文件"""
        # 查找主配置文件
        config_files = [
            search_dir / "main.mcui",
            search_dir / "config.mcui", 
            search_dir / "manifest.json"
        ]
        
        # 同时查找任何.mcui文件
        mcui_files = list(search_dir.glob("**/*.mcui"))
        config_files.extend(mcui_files)
        
        for config_file in config_files:
            if config_file.exists():
                print(f"找到配置文件: {config_file}")
                return config_file
        
        # 如果没有找到，尝试查找任何JSON文件
        json_files = list(search_dir.glob("**/*.json"))
        for json_file in json_files:
            # 跳过可能的动画配置文件
            if not json_file.name.endswith('.mcmeta'):
                print(f"使用JSON文件作为配置: {json_file}")
                return json_file
        
        return None
    
    def cleanup(self):
        """清理临时文件"""
        for temp_dir in self.temp_dirs:
            import shutil
            try:
                shutil.rmtree(temp_dir)
                print(f"清理临时目录: {temp_dir}")
            except Exception as e:
                print(f"清理临时目录失败 {temp_dir}: {e}")
        self.temp_dirs.clear()